const target = {
  foo: 'bar',
  sayHello() {
    console.log('hello');
  },
  [Symbol.iterator]: 'erqi',
  sayName() {
    console.log(this.name);
  }
}

// const obj1 = {
//   uanme: 'obj1'
// }

// Object.setPrototypeOf(target, obj1)
const handler = {
  get() {
    console.log('get()');
    return Reflect.get(...arguments)
  },
  has() {
    console.log('has()');
    return Reflect.has(...arguments)
  },
  defineProperty() {
    console.log('defineProperty()');
    return Reflect.defineProperty(...arguments)
  },
  getOwnPropertyDescriptor() {
    console.log('getPropertyDescriptor()');
    return Reflect.getOwnPropertyDescriptor(...arguments)
  },
  deleteProperty() {
    console.log('deleteProperty()');
    return Reflect.defineProperty(...arguments)
  },
  ownKeys() {
    console.log('ownKeys()');
    return Reflect.ownKeys(...arguments)
  },
  getPrototypeOf() {
    console.log('getPrototypeOf()');
    return Reflect.getPrototypeOf(...arguments)
  },
  setPrototypeOf() {
    console.log('setPrototypeOf()');
    return Reflect.setPrototypeOf(...arguments)
  },
  isExtensible() {
    console.log('isExtensible()');
    return Reflect.isExtensible(...arguments)
  },
  preventExtensions() {
    console.log('preventExtensions()');
    return Reflect.preventExtensions(...arguments)
  },

}

const proxy = new Proxy(target, handler)

// console.log(Object.defineProperty(proxy, 'uname', {
//   value: 'cuifanfan'
// }));
// console.log(Reflect.has(target, 'foo'));
// console.log(Reflect.has(proxy, 'foo'));

// console.log(Reflect.defineProperty(proxy, 'uname', {
//   value: 'cuifanfan',
//   configurable: false
// }));
// console.log(Object.getOwnPropertyDescriptor(proxy, 'foo'));
// console.log(Reflect.getOwnPropertyDescriptor(target, 'foo'));
// console.log(Reflect.getOwnPropertyDescriptor(target, 'uname1'));
// console.log(Reflect.deleteProperty(target, 'foo'));
// console.log(Reflect.ownKeys(proxy));
// Object.defineProperty(target, 'uname', {
//   value: 'cuifanfan',
//   enumerable: false
// })
// Object.defineProperty(target, "age", {
//   value: 'counter',
//   enumerable: true
// })

// console.log(Object.keys(proxy));
// console.log(Reflect.ownKeys(proxy));

// console.log(Object.getOwnPropertySymbols(target));
// console.log(Object.getPrototypeOf(proxy) === target);
// console.log(Object.keys(proxy));
// console.log(Reflect.getPrototypeOf(proxy));
// console.log(proxy.__proto__);
// console.log(obj1.isPrototypeOf(proxy));
// console.log(proxy instanceof Object);
// console.log(Object.setPrototypeOf(proxy, obj1));
// console.log(Reflect.setPrototypeOf(proxy, obj1));log
// console.log(Object.setPrototypeOf(proxy, obj1));

// let obj2 = {
//   uname: 'cuifanfan2'
// }

// let obj3 = {
//   uname: 'cuifanfan3'
// }

// obj2.__proto__ = obj3
// console.log(Object.getPrototypeOf(obj2) === obj3);
// Object.preventExtensions(obj2)
// console.log(obj2);
// obj2.uname = 'cuifan'
// console.log(obj2);
// // obj2.__proto__ = obj3
// // obj2.uname1 = 1
// // console.log(obj2);
// // Object.defineProperty(obj2, "cuifan", {
// //   value: 1
// // })
// var nonExtensible = {
//   removable: true
// };
// console.log(Object.isExtensible(nonExtensible));
// console.log(Reflect.isExtensible(proxy));
// console.log(Object.isExtensible(proxy));
// console.log(Object.preventExtensions(proxy));
// console.log(Reflect.preventExtensions(proxy));
// const obj4 = {
//   name: 'obj4'
// }

// proxy.sayName.call(obj4)
var name = 'cuifan'

function myTarget() {
  // console.log(this.uname);
}
const obj4 = {
  uname: 'obj4'
}
const handler1 = {
  apply() {
    console.log('apply()');
    return Reflect.apply(...arguments)
  },
  construct() {
    console.log('construct()');
    return Reflect.construct(...arguments)
  }
}

const proxy1 = new Proxy(myTarget, handler1)
  // Reflect.apply(proxy1, obj4, ['cuifan'])
  // proxy1.apply(obj4, [])
  // new proxy1()
  // Reflect.construct(proxy1, [], myTarget)